* keyboard.c (menu_bar_items): Bind Qinhibit_quit to Qt while we
authorJim Blandy <jimb@redhat.com>
Fri, 28 May 1993 08:48:33 +0000 (08:48 +0000)
committerJim Blandy <jimb@redhat.com>
Fri, 28 May 1993 08:48:33 +0000 (08:48 +0000)
call the keymap accessors; this gets called during redisplay.

src/keyboard.c

index f1b577ed70fbef044c8add3fa9f878003a879147..97527896704fd1482db199e6c57cb087e8cbdefd 100644 (file)
@@ -3059,6 +3059,8 @@ static Lisp_Object menu_bar_one_keymap ();
 Lisp_Object
 menu_bar_items ()
 {
+  int count = specpdl_ptr - specpdl;
+
   /* The number of keymaps we're scanning right now, and the number of
      keymaps we have allocated space for.  */
   int nmaps;
@@ -3073,6 +3075,12 @@ menu_bar_items ()
 
   int mapno;
 
+  /* In order to build the menus, we need to call the keymap
+     accessors.  They all call QUIT.  But this function is called
+     during redisplay, during which a quit is fatal.  So inhibit
+     quitting while building the menus.  */
+  specbind (Qinhibit_quit, Qt);
+
   /* Build our list of keymaps.
      If we recognize a function key and replace its escape sequence in
      keybuf with its symbol, or if the sequence starts with a mouse
@@ -3108,7 +3116,7 @@ menu_bar_items ()
        result = menu_bar_one_keymap (def, result);
     }
 
-  return Fnreverse (result);
+  return unbind_to (count, Fnreverse (result));
 }
 \f
 /* Scan one map KEYMAP, accumulating any menu items it defines